package com.pdh.service;

import com.pdh.bean.Message;
import com.pdh.bean.User;
import com.pdh.dao.BaseUserDao;
import com.pdh.dao.imp.UserDaoMysql;
import com.pdh.exception.DuplicatePhoneException;
import com.pdh.exception.UnHandleException;
import com.pdh.paging.BootStrapTableUser;
import com.pdh.paging.ResultData;
import com.pdh.util.DateFormatUtil;
import com.pdh.util.LoggerUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Author: 彭德华
 * @Date 2021-08-29 22:19
 */
public class UserService {

     private static BaseUserDao dao = new UserDaoMysql();

    /**
     * 把User -> BootStrapTableUser 实现代码块进行封装，多次使用到
     * @param user
     * @return tableUser
     */
    private static BootStrapTableUser transUserToTableUser(User user){
        int id = user.getId();
        String userName = user.getUsername();
        String userPhone = user.getUserPhone();
        String password = user.getPassword();
        String status = null;
        switch (user.getStatus()) {
            //0 未登录,1 已登录,2 已挂失,3 已删除,4 已注销
            case 0:
                status = "未登录";
                break;
            case 1:
                status = "已登录";
                break;
            case 2:
                status = "已挂失";
                break;
            case 3:
                status = "已删除";
                break;
            case 4:
                status = "已注销";
                break;
            default:
                status = "此快递不存在";
                break;
        }
        String userIdCardNo = user.getUserIdCardNo();
        String loginTime = user.getLoginTime() == null ? "从未登陆" : DateFormatUtil.format(user.getLoginTime());
        String loginIp = user.getLoginIp();
        String isAdmin = user.isCourier() ? "是" : "否";
        String createTime = DateFormatUtil.format(user.getCreateTime());
        String updateTime = user.getUpdateTime() == null ? "未更新" : DateFormatUtil.format(user.getUpdateTime());
        BootStrapTableUser tableUser = new BootStrapTableUser(id,userName,userPhone,password,status,userIdCardNo,loginTime,loginIp,isAdmin,createTime,updateTime);
        return tableUser;
    }

    /**
     * 于查询数据库中的用户信息(用户数量，日注册量)
     * @return [{size:总数,day:新增}]
     */
    public static Message consoleUser(){
        Message msg = null;
        Map<String,Integer> data = null;
        try {
            data = dao.consoleUser();
            if(data.size() == 0){//数据为空
                msg = new Message(-1,"数据为空");
            } else {
                msg = new Message(0,"获取成功",data);
            }
        } catch (UnHandleException e) {
            //未收录异常也返回到前端
            msg = new Message(-1,"获取失败,未知异常");
            LoggerUtil.getLogger(UserService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 用于查询所有的用户
     * @param paging 是否分页标记 true/false 分页/查询所有
     * @param offset sql语句起始索引
     * @param limit 页查询的数量
     * @return 用户的集合
     */
    public static Message findAll(boolean paging, int offset, int limit) {
        Message msg = null;
        //在此处封装数据 业务逻辑过长，就包装到service处理
        List<User> queryList = null;
        try {
            queryList = dao.findAll(paging, offset, limit);
            Integer total = dao.consoleUser().get("userCount");//userCount表示用户总数
            //1.将集合封装为 bootstrap-table识别的格式
            List<BootStrapTableUser> tableList = new ArrayList<>();
            if(queryList != null){
                for (User user : queryList) {
                    BootStrapTableUser u = transUserToTableUser(user);
                    tableList.add(u);
                }
                //将集合封装为bootstrap-table识别的格式
                ResultData<BootStrapTableUser> data = new ResultData<>(tableList,total);
                msg = new Message(0,"查询成功",data);
            }else {
                msg = new Message(-1,"数据为空");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"获取失败,未知异常");
            LoggerUtil.getLogger(UserService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 根据用户手机号查询用户信息
     * @param userPhone 用户手机号
     * @return 查询的用户信息列表，电话不存在时候放回null
     */
    public static Message findByUserPhone(String userPhone) {
        Message msg = null;
        User queryUser = null;
        try {
            queryUser = dao.findByUserPhone(userPhone);
            if(queryUser != null){
                //查询成功
                msg = new Message(0,"查询成功",queryUser);
            } else {
                msg = new Message(-1,"未查找到该用户");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"获取失败,未知异常");
            LoggerUtil.getLogger(UserService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 用户的增加
     * @param user 录入用户的对象
     * @return
     */
    public static Message insert(User user) {
        Message msg = null;
        try {
            boolean flag = dao.insert(user);
            if(flag){
                //录入成功
                msg = new Message(0,"用户录入成功");
            } else {
                msg = new Message(-1,"用户录入失败");
            }
        } catch (DuplicatePhoneException e) {
            msg = new Message(-2,"此号码已注册,请勿重复注册!");
        } catch (UnHandleException e) {
            msg = new Message(-1,"用户录入失败,未知异常");
            LoggerUtil.getLogger(UserService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 根据id删除单个用户 为什么不用userPhone进行删除，因为可能一个号码对应多个用户，就删除了多个用户
     * @param id 要删除的用户id
     * @return 删除的结果
     */
    public static Message delete(int id){
        Message msg =null;
        try {
            boolean flag = dao.delete(id);
            if(flag){
                msg = new Message(0,"删除成功");
            } else {
                msg = new Message(-1,"删除失败");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"删除失败,未知异常");
            LoggerUtil.getLogger(UserService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 用户的修改
     * @param id 要修改的编号
     * @param newUser 新的用户对象
     * @return 修改的结果
     */
    public static Message update(int id,User newUser){//前端判断手机号不能为空 正则表达式
        Message msg =null;
        try {
            boolean flag = dao.update(id,newUser);
            if(flag){
                msg = new Message(0,"更新成功");
            } else {
                msg = new Message(-1,"很遗憾,更新失败");
            }
        } catch (DuplicatePhoneException e) {
            msg = new Message(-2,"此号码已注册,不可更改为此号码!");
        } catch (UnHandleException e) {
            msg = new Message(-1,"用户更新失败,未知异常");
            LoggerUtil.getLogger(UserService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 前台用户登陆的时候使用的service
     * @param userPhone
     * @return
     */
    public static Message login(String userPhone) {
        Message msg =null;
        try {
            boolean flag = dao.login(userPhone);
            if(flag){
                msg = new Message(0,"登陆成功");
            } else {
                msg = new Message(-1,"很遗憾,登陆失败");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"用户登陆失败,未知异常");
            LoggerUtil.getLogger(UserService.class).error(e.getMessage());
        }
        return msg;
    }

    public static Message updateLoginInformation(String userPhone, boolean isCourier, String ip) {
        Message msg =null;
        try {
            boolean flag = dao.updateLoginInformation(userPhone,isCourier,ip);
            if(flag){
                msg = new Message(0,"更新成功");
            } else {
                msg = new Message(-1,"更新失败");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"更新失败,未知异常");
            LoggerUtil.getLogger(UserService.class).error(e.getMessage());
        }
        return msg;
    }

    /**
     * 前台用户登陆的时候使用的service
     * @param id
     * @return
     */
    public static Message logout(int id) {
        Message msg =null;
        try {
            boolean flag = dao.logout(id);
            if(flag){
                msg = new Message(0,"退出成功");
            } else {
                msg = new Message(-1,"退出失败");
            }
        } catch (UnHandleException e) {
            msg = new Message(-1,"退出失败,未知异常");
            LoggerUtil.getLogger(UserService.class).error(e.getMessage());
        }
        return msg;
    }

}
